package cn.xiaolang.common.utils;

import java.util.List;

/**
 * list分批处理助手
 * 
 * @author DeanKano
 * @date 2018年3月30日
 * @param <T>
 *            list中存储的类型
 */
public abstract class ListBatchHelper<T> {

	private final int DEFAULT_BATCH_THRESHOLD = 500;// 默认批次阈值

	private int batchThreshold = DEFAULT_BATCH_THRESHOLD;

	private List<T> datas;

	public ListBatchHelper(List<T> datas) {
		super();
		this.datas = datas;
	}

	public int getBatchThreshold() {
		return batchThreshold;
	}

	public ListBatchHelper<T> setBatchThreshold(int batchThreshold) {
		this.batchThreshold = batchThreshold;
		return this;
	}

	/**
	 * 开始分批
	 */
	public void begin() {
		if (datas == null || datas.isEmpty()) {
			return;
		}
		int size = datas.size();
		int times = size / batchThreshold;// 批次
		if (size > batchThreshold) {
			for (int i = 0; i < times; i++) {
				List<T> subList = datas.subList(0, batchThreshold);
				doSomething(subList);
				datas.subList(0, batchThreshold).clear();
			}
		}
		if (size <= batchThreshold || !datas.isEmpty()) {
			doSomething(datas);
		}
	}

	/**
	 * 分批业务
	 */
	public abstract void doSomething(List<T> datas);

//	public static void main(String[] args) {
//		List<Object[]> datas = new ArrayList<>();
//		for (int i = 0; i < 24; i++) {
//			datas.add(new Object[] { "A", i });
//		}
//		new ListBatchHelper<Object[]>(datas) {
//			@Override
//			public void doSomething(List<Object[]> datas) {
//				System.err.println(datas);
//			}
//		}.setBatchThreshold(5).begin();
//	}
}
